// RT-Thread头文件
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <rtdevice.h>
#include <board.h>

// HAL库头文件
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "rt_thread_demo.h"
#include "../hardware/USART_ALL/usart_all.h"        // Serial
#include "../hardware/MP3m/mp3m.h"
uint8_t Send_MP3_BUF[20]; // MP3数据包

/**
  * 函数功能 : 设备初始化（设置音量等）
  * 参    数 : 无
  * 返 回 值 : 无
  */
void MP3_Init(void)
{
    HAL_Delay(2000);        // 等待机器
    MP3_Set_volume(18);     // 设置音量为18
}

/**
  * 函数功能 : 给语音驱动发送命令
  * 参    数 : cmd    —— 命令
  *            folder —— 文件夹
  *            file   —— 文件（16进制）
  * 返 回 值 : 无
  */
void MP3_Send(uint8_t cmd, uint8_t folder, uint8_t file)
{
    Send_MP3_BUF[0] = 0x7E;        // 起始命令
    Send_MP3_BUF[1] = 0xFF;        // 版本信息
    Send_MP3_BUF[2] = 0x06;        // 数据长度（不含校验）
    Send_MP3_BUF[3] = cmd;         // 命令字节（指定文件夹和文件播放曲目）
    Send_MP3_BUF[4] = 0x00;        // 不需要应答
    Send_MP3_BUF[5] = folder;      // 文件夹
    Send_MP3_BUF[6] = file;        // 文件

    // 计算校验和
    int16_t sum = 0;
    for (int i = 1; i <= 6; i++) { // 累加数据段[1]~[6]
        sum += Send_MP3_BUF[i];
    }
    int16_t checksum = ~(int16_t)sum + 1; // 取补码

    // 填充校验和高低字节
    Send_MP3_BUF[7] = (checksum >> 8) & 0xFF; // 高字节
    Send_MP3_BUF[8] = checksum & 0xFF;        // 低字节

    Send_MP3_BUF[9] = 0xEF;        // 结束命令

    Serial_printf(SERIAL3,"%s",Send_MP3_BUF);
//    USART1_SendBuffer(Send_MP3_BUF, 10);
//    USART2_SendBuffer(Send_MP3_BUF, 10);
}

/**
  * 函数功能 : 停止播放
  * 参    数 : 无
  * 返 回 值 : 无
  */
void MP3_Stop_Play(void)
{
    MP3_Send(STOP_AD, 0x00, 0x00);
}

/**
  * 函数功能 : 设置音量
  * 参    数 : volume —— 音量大小（0~30）
  * 返 回 值 : 无
  */
void MP3_Set_volume(uint8_t volume)
{
    MP3_Send(SET_VOLUME, 0x00, volume);
}

/**
  * 函数功能 : MP3文件夹播放指定曲目
  * 参    数 : number —— 曲目编号（1~9999）
  * 返 回 值 : 无
  * 说    明 : 例如 number=1，folder=0，file=1；number=1203，folder=12，file=3
  */
void MP3_PLAY(uint16_t number)
{
    if(number < 1 || number > 9999) return; // 确保number在1到9999之间
    uint8_t folder = number / 100;   // 取百位和千位作为文件夹
    uint8_t file   = number % 100;   // 取个位和十位作为文件
    MP3_Send(PLAY_MP3_INDEX, folder, file);
}
